home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 34.zip / BS1 part 34 / FredFish PD 314.adf / Zc / zcsrc.lzh / IOLib / stdio / open.c < prev    next >
C/C++ Source or Header  |  1989-06-16  |  2KB  |  104 lines

  1. #include <libraries/dos.h>
  2. #include <stdio.h>
  3. #include <fcntl.h>
  4. #include <errno.h>
  5.  
  6. extern struct _device *_devtab[];
  7. extern void (*_closeall)();
  8. void closeall(); /* foreward reference */
  9.  
  10. int open(filename, iomode, pmode)
  11. register char *filename;
  12. register int iomode, pmode;
  13. {
  14.  
  15.     register struct _device *p;
  16.     register int rv, h;
  17.     register long dosrv;
  18.     long Open(), DeleteFile(), IoErr();
  19.     long mode;
  20.  
  21.     Chk_Abort();
  22.  
  23.     /*
  24.      * Find the first empty entry in the device table.
  25.      */
  26.  
  27.     p = &((*_devtab)[0]);
  28.     for ( h=0; h<OPEN_MAX; h++ ) {
  29.         if ( !p[h].fileHandle )
  30.             break;
  31.     }
  32.  
  33.     if ( h >= OPEN_MAX )
  34.         return (errno = EMFILE);
  35.  
  36.     if(!access(filename, 0x00)){        /* file exists */
  37.         if((iomode & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
  38.             return(errno = EEXIST);
  39.  
  40.         if ( !(iomode & O_TRUNC) )
  41.             mode = MODE_OLDFILE;
  42.         else{
  43.             if ( !DeleteFile( filename ) )
  44.                 goto dos_err;
  45.             mode = MODE_NEWFILE;
  46.         }
  47.  
  48.         dosrv = Open(filename, mode);
  49.         if ( dosrv == 0 )
  50.             goto dos_err;
  51.     } else {                /* file doesn't exist */
  52.         if(iomode & O_CREAT){
  53.             dosrv = Open(filename, MODE_NEWFILE);
  54.             if ( dosrv == 0 )
  55.                 goto dos_err;
  56.         }
  57.         else
  58.             return (errno = ENOENT);
  59.         }
  60.  
  61.     p = &((*_devtab)[h]);
  62.     p->fileHandle = dosrv;
  63.     p->mode = iomode;
  64.  
  65.     if( iomode & O_APPEND )
  66.         lseek(h, 0L, SEEK_END);
  67.  
  68.     _closeall = closeall;
  69.     return(h);
  70.  
  71. dos_err:
  72.     errno = IoErr();
  73.     return -1;
  74.  
  75. }
  76.  
  77. int close(handle)
  78. unsigned int handle;
  79. {
  80.     void Close();
  81.     register struct _device *p;
  82.  
  83.     if ( handle >= OPEN_MAX )
  84.         return ( errno = EBADF ); 
  85.     p = &((*_devtab)[handle]);
  86.     if ( !(p->mode & O_STDIO) && p->fileHandle != 0 ) {
  87.         Close( p->fileHandle );
  88.         p->fileHandle = 0;
  89.         p->mode = 0;
  90.     }
  91.  
  92.     return 0;
  93. }
  94.  
  95. static void closeall()
  96. {
  97.     int fd;
  98.  
  99.     for (fd = 0 ; fd < OPEN_MAX ; ++fd)
  100.         close( fd );
  101.     free( *_devtab );
  102.  
  103. }
  104.